package com.puppet.building182.handler;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
public class TestAspect {
    //切入点定义
//所有service层中任何返回值的 方法名必须 save开头 参数不限制的 方法全部走AOP
//访问修饰符(可选)| 返回值类型(必写)|类全路径 +方法+ 参数
    @Pointcut("execution(public * com.puppet.building182.service.impl.*.add*(..))")
    public void pt() {
    }

    //业务: 切入点所覆盖的方法执行前打印 HelloWorld
    // 通知类的注解:@Before(重点)@After@AfterReturning(重点)@AfterThrowing @Around(重点)
    // @Before 前置通知 (方法执行前触发AOP)
    @Before("pt()")
    public void TestBefore() {
        System.out.println("TestBefore");
    }

    //@After 就是下面的两个合并版本
    @After("pt()")
    public void TestAfter() {
        System.out.println("TestAfter");
    }

    //@AfterReturning 返回值返回后触发
    @AfterReturning("pt()")
    public void TestAfterReturn() {
        System.out.println("TestAfterReturn");
    }

    //@AfterThrowing 如果方法出现异常才会触发
    @AfterThrowing("pt()")
    public void TestAfterThrowing() {
        System.out.println("TestAfterThrowing");
    }

    //@Around 就是上面的两个合并版本
    @Around("pt()")
    public Object TestAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("TestAround");
        Object[] args = pjp.getArgs();
        System.out.println("参数：" + Arrays.toString(args));
        return pjp.proceed();
    }
}
